package com.fxdigital.nvr;

import java.util.List;

/**
 * NVR相关
 * */
public class NVRCtrl {
	static {
		System.loadLibrary("nvr");
	}
	
	// 初始化环境
	// 返回值: 1表示成功，0表示失败
	public native int NVRInit();
	
	// 清理环境
	// 返回值: 1表示成功，0表示失败
	public native int NVRUnInit();
	
	// 创建会话
	// deviceType: NVR设备类型，1-海康，其他类型预留
	// subDeviceType: NVR设备子类型，预留
	// ip: NVR设备IP地址
	// port: NVR设备端口
	// userName: NVR设备登陆用户名
	// password: NVR设备登陆密码
	// 返回值：成功时返回一个非负整数，表示会话句柄；失败时返回-1
	public native int NVRCreateSession(int deviceType, int subDeviceType, String ip, 
			                             int port, String userName, String password);
	
	// 删除会话
	// session: 要删除的会话句柄，由NVRCreateSession返回
	// 返回值: 1表示成功，0表示失败
	public native int NVRDeleteSession(int session);
	
	// 获取设备序列号
	// session: 会话句柄
	// deviceInfo: 传出参数，表示获取到的设备信息
	// 返回值: 1表示成功，0表示失败
	public native int NVRGetDeviceInfo(int session, DeviceInfo deviceInfo);
	
	// 硬盘相关操作
	// session: 会话句柄
	// diskIndex: 硬盘号，从0开始
	// ctrlCode: 操作码，1表示格式化，此时listDiskInfo参数无效，可忽略；2表示获取硬盘状态信息，由listDiskInfo传出
	// listDiskInfo: 数组，输出参数，表示硬盘信息，当ctrlCode为1时，可忽略此参数
	// 返回值: 1表示成功，0表示失败
	public native int NVRDiskCtrl(int session, int diskIndex, int ctrlCode, List<DiskInfo> listDiskInfo);
	
	// 设置自定义协议
	// 在某些情况下，配合添加IP通道使用
	// session: 会话句柄
	// protocolIndex: 自定义协议索引号，从1开始，custom-1对应的protocolIndex值为1，依次类推。自定义协议最多只有16个
	// customProtocol: 输入参数，自定义协议信息
	// 返回值: 1表示成功，0表示失败
	public native int NVRSetCustomProtocol(int session, int protocolIndex, CustomProtocol customProtocol);
	
	// IP通道相关操作
	// session: 会话句柄
	// ctrlCode: 操作码，1表示添加，2表示删除，3表示查询，4表示修改
	// listIPChannelInfo: 数组，存放IP通道信息，当ctrlCode为2时，可忽略此参数，当ctrlCode为4时，其元素个数固定为1
	// channel: 当ctrlCode为1和3时，此参数无效，可忽略；当ctrlCode为2和4时，表示待操作的IP通道号，从1开始
	// 当ctrlCode为3时，listIPChannelInfo是输出参数；当ctrlCode为1,2,4时，listIPChannelInfo是输入参数，其中，当ctrlCode为2时，listIPChannelInfo可被忽略
	// 返回值: 1表示成功，0表示失败
	public native int NVRIPChannelCtrl(int session, int ctrlCode, List<IPChannelInfo> listIPChannelInfo, int channel);
	
	// 设置录像打包参数
	// session: 会话句柄
	// packageInterval: 录像文件打包的时间间隔，时间单位：分钟 
	// 返回值: 1表示成功，0表示失败
	public native int NVRSetRecordPack(int session, int packageInterval);
	
	// 录像相关操作
	// session: 会话句柄
	// recordMode: 录像模式，1-计划录像，2-手动录像
	// ctrlCode: 操作码，1-开始录像，2-停止录像
	// channel: 通道号
	// weekIndex: 本星期日期索引，1-本周一，2-本周二，...，7-本周日，当recordMode为2或ctrlCode为2时，可忽略此参数
	// manualRecordType：手动录像类型，0- 手动，1- 报警，2- 回传，3- 信号，4- 移动，5- 遮挡，当recordMode为1时或ctrlCode为2时，可忽略此参数
	// planRecordParam: 计划录像参数信息，当recordMode为2或ctrlCode为2时，可忽略此参数
	// 返回值: 1表示成功，0表示失败
	public native int NVRRecordCtrl(int session, int recordMode, int ctrlCode, int channel, int weekIndex, int manualRecordType, PlanRecordParam planRecordParam);
	
	// 查询某通道的计划录像参数
	// session: 会话句柄
	// channel: 通道号
	// weekIndex: 本星期日期索引，1-本周一，2-本周二，...，7-本周日，当recordMode为2或ctrlCode为2时，可忽略此参数
	// planRecordParam: 输出参数，计划录像参数信息
	// 返回值: 1表示成功，0表示失败
	public native int NVRQueryPlanRecordParam(int session, int channel, int weekIndex, PlanRecordParam planRecordParam);
	
	// 获取通道录像状态信息
	// session: 会话句柄
	// listChannelRecordStatus: 输出参数，数组，每一个元素对应一个IP通道的录像状态信息
	// 返回值: 1表示成功，0表示失败
	public native int NVRQueryChannelRecordStatus(int session, List<ChannelRecordStatus> listChannelRecordStatus);
	
	// 录像文件加锁和解锁（按文件名）
	// session: 会话句柄
	// isLock: 0-解锁，1-锁定
	// fileName: 待加锁（或解锁）的录像文件名
	// 返回值: 1表示成功，0表示失败
	public native int NVRLockRecordFileByName(int session, int isLock, String fileName);
	
	// session: 会话句柄
	// isLock: 0-解锁，1-锁定
	// lockByTimeParam: 输入参数，按时间加锁（或解锁）参数
	// lockByTimeResult: 输出参数，按时间加锁（或解锁）结果
	// 返回值: 1表示成功，0表示失败
	public native int NVRLockRecordFileByTime(int session, int isLock, LockByTimeParam lockByTimeParam, LockByTimeResult lockByTimeResult);
	
	// 回放和抓图相关操作
	// session: 会话句柄
	// ctrlCode: 回放控制码，1-开始播放，2-停止播放，3-暂停播放，4-恢复播放，5-快放，6-抓图
	// 7-慢放，8-正常速度播放，9-单帧放，10-打开声音，11-关闭声音，12-倒放切换为正放，13-正放切换为倒放
	// playBackParam: 回放参数
	// capturePictureParam: 抓图参数，当ctrlCode为6时有效，当ctrlCode不为6时，可忽略此参数
	// playHandle: 回放句柄，当ctrlCode为1时，是输出参数；当ctrlCode不为1时，是输入参数，此时函数中其它参数可以根据需要有选择性地忽略
	// 返回值: 1表示成功，0表示失败
	public native int NVRPlayBackCtrl(int session, int ctrlCode, PlayBackParam playBackParam, CapturePictureParam capturePictureParam, PlayHandle playHandle);
	
	// 获取录像回放时显示的OSD时间
	// session: 会话句柄
	// playHandle: 回放句柄，由NVRPlayBackCtrl得到
	// timeInfo: 传出参数，表示要得到的OSD时间
	// 返回值: 1表示成功，0表示失败
	public native int NVRGetPlayBackOSDTime(int session, PlayHandle playHandle, TimeInfo timeInfo);

	// 获取设备当前时间
	// session: 会话句柄
	// timeInfo: 传出参数，表示设备当前时间
	// 返回值: 1表示成功，0表示失败
	public native int NVRGetCurrentTime(int session, TimeInfo timeInfo);
	
	// 根据文件类型、时间查找录像文件
	// session: 会话句柄
	// findCondition: 文件查找条件
	// listFindResult: 输出参数，保存文件查找结果集合
	// 返回值: 1表示成功，0表示失败
	public native int NVRFindRecordFile(int session, FindCondition findCondition, List<FindResult> listFindResult);
	
	// 根据事件查找录像文件
	// session: 会话句柄
	// findByEventCondition: 文件查找条件
	// listFindByEventResult: 输出参数，保存文件查找结果集合
	// 返回值: 1表示成功，0表示失败
	public native int NVRFindRecordFileByEvent(int session, FindByEventCondition findByEventCondition, List<FindByEventResult> listFindByEventResult);
	
	// 录像标签
	// session: 会话句柄
	// ctrlCode: 操作码，1表示添加，2表示删除，3表示查询，4表示修改
	// playHandle: 回放句柄，当ctrlCode为1时有效，由NVRPlayBackCtrl函数得到，ctrlCode为2,3,4时可忽略此参数
	// listRecordLabel: 集合，录像标签信息，当ctrlCode为1,2,3时有效，当ctrlCode为4时，可忽略此参数
	// recordSearchParam：查询操作的参数，当ctrlCode为3时有效，当ctrlCode为1,2,4时，可忽略此参数
	// recordModifyParam: 修改操作的参数，当ctrlCode为4时有效，当ctrlCode为1,2,3时，可忽略此参数
	// 当ctrlCode为3时，listRecordLabel是输出参数；当ctrlCode为1,2,4时，listRecordLabel是输入参数
	// 返回值: 1表示成功，0表示失败
	public native int NVRRecordLabelCtrl(int session, int ctrlCode, PlayHandle playHandle, List<RecordLabel> listRecordLabel, RecordSearchParam recordSearchParam, RecordModifyParam recordModifyParam);
	
	// 按文件名下载录像文件
	// session: 会话句柄
	// nvrFileName: 要下载的录像文件名
	// savedFileName: 下载后保存到PC机的文件路径，需为绝对路径，包括文件名
	// ctrlCode: 下载操作控制码，1-开始下载，2-停止下载，3-暂停下载，4-恢复下载
	// downloadHandle: 输出参数，传出下载句柄
	// 返回值: 1表示成功，0表示失败
	public native int NVRDownloadFileByName(int session, String nvrFileName, String savedFileName, int ctrlCode, DownloadHandle downloadHandle);
	
	// 按时间下载录像文件
	// session: 会话句柄
	// ipChannel: IP通道号
	// startTime: 起始时间
	// stopTime: 停止时间
	// savedFileName: 下载后保存到PC机的文件路径，需为绝对路径，包括文件名
	// ctrlCode: 下载操作控制码，1-开始下载，2-停止下载，3-暂停下载，4-恢复下载
	// downloadHandle: 输出参数，传出下载句柄
	// 返回值: 1表示成功，0表示失败 
	public native int NVRDownloadFileByTime(int session, int ipChannel, TimeInfo startTime, TimeInfo stopTime, 
	                                          String savedFileName, int ctrlCode, DownloadHandle downloadHandle);
	
	// 获取当前下载录像文件的进度
	// session: 会话句柄
	// downloadHandle: 下载操作句柄，由NVRDownloadFileByName或NVRDownloadFileByTime得到
	// 返回值: -1表示失败；0~100表示下载进度，100表示下载结束；200表示网络异常
	public native int NVRGetDownloadPos(int session, DownloadHandle downloadHandle);
	
	public static void main(String[] args) {
		System.out.println("Hello, world");
		NVRCtrl nvrCtrl = new NVRCtrl();
		nvrCtrl.NVRInit();
		
		int session = nvrCtrl.NVRCreateSession(1, 0, "192.168.1.144", 8000, "admin", "12345");
		System.out.println(session);
		
		DeviceInfo deviceInfo = new DeviceInfo();
		nvrCtrl.NVRGetDeviceInfo(session, deviceInfo);
		System.out.println(deviceInfo.getSerialNumber());
		System.out.println(deviceInfo.getMaxIPChannel());
		
		TimeInfo timeInfo = new TimeInfo();
		nvrCtrl.NVRGetCurrentTime(session, timeInfo);
		System.out.println(timeInfo.getYear() + "年");
		System.out.println(timeInfo.getMonth() + "月");
		System.out.println(timeInfo.getDay() + "日");
		System.out.println(timeInfo.getHour() + "时");
		System.out.println(timeInfo.getMinute() + "分");
		System.out.println(timeInfo.getSecond() + "秒");
		
		nvrCtrl.NVRUnInit();
	}
}
